#pragma once
#include <iostream>
#include <string>

// 定义支持的运算符
std::string opers="+-*/%";

// 错误码枚举
enum{
    DivZero=1,  // 除零错误
    ModZero,    // 取模零错误
    Unknown     // 未知运算符错误
};

// 计算任务类
class Task
{
public:
    // 构造函数
    // x: 第一个操作数
    // y: 第二个操作数
    // op: 运算符
    Task(int x, int y, char op) 
        : data1_(x)
        , data2_(y)
        , oper_(op)
        , result_(0)    // 初始化计算结果为0
        , exitcode_(0)  // 初始化错误码为0
    {
    }

    // 执行计算任务
    void run()
    {
        switch (oper_)
        {
        case '+':  // 加法
            result_ = data1_ + data2_;
            break;
        case '-':  // 减法
            result_ = data1_ - data2_;
            break;
        case '*':  // 乘法
            result_ = data1_ * data2_;
            break;
        case '/':  // 除法
            {
                if(data2_ == 0) 
                    exitcode_ = DivZero;  // 除数为0，设置错误码
                else 
                    result_ = data1_ / data2_;
            }
            break;
        case '%':  // 取模
           {
                if(data2_ == 0) 
                    exitcode_ = ModZero;  // 除数为0，设置错误码
                else 
                    result_ = data1_ % data2_;
            }            
            break;
        default:  // 未知运算符
            exitcode_ = Unknown;
            break;
        }
    }

    // 函数调用运算符重载，使对象可以像函数一样调用
    void operator ()()
    {
        run();
    }

    // 获取完整的计算结果字符串
    // 格式：操作数1 运算符 操作数2 = 结果 [错误码]
    std::string GetResult()
    {
        std::string r = std::to_string(data1_);  // 第一个操作数
        r += oper_;                              // 运算符
        r += std::to_string(data2_);            // 第二个操作数
        r += "=";                               // 等号
        r += std::to_string(result_);           // 计算结果
        r += "[code: ";                         // 错误码标记
        r += std::to_string(exitcode_);         // 错误码
        r += "]";

        return r;
    }

    // 获取待计算的表达式字符串
    // 格式：操作数1 运算符 操作数2 =?
    std::string GetTask()
    {
        std::string r = std::to_string(data1_);  // 第一个操作数
        r += oper_;                              // 运算符
        r += std::to_string(data2_);            // 第二个操作数
        r += "=?";                              // 待计算标记
        return r;
    }

    // 析构函数
    ~Task()
    {
    }

private:
    int data1_;    // 第一个操作数
    int data2_;    // 第二个操作数
    char oper_;    // 运算符

    int result_;   // 计算结果
    int exitcode_; // 错误码：0-成功，非0-失败
};